package com.itheima.d2_collections;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 目标：掌握Collections集合工具类的使用。
 *
 * 注意：不是collection单列集合接口
 * Collections是一个用来操作集合的工具类
 */
public class CollectionsTest1 {
    public static void main(String[] args) {
     /*
          在day3讲解泛型
          ? 通配符，在使用泛型的时候可以代表一切类型（而E，T什么的是我们自己定义的类型变量）
         <? super T> (下界通配符)    T及其父类型。第一个参数是接一个集合，第二个参数是可变参数。
         <? extends T> (上界通配符)   T及其子类型
         1、public static <T> boolean addAll(Collection<? super T> c, T...elements)：为集合批量添加数据
        解释泛型：假设送进来的集合元素类型是animal，也就是说问号是animal，意思就是说animal是T的父类，那么T就必须是猫狗等

 限定T能接的数据类型:所以把<T>改成<T extends Car>，这样就限定了T能接的类型一定是car或者car的子类
 * 泛型的上下限：
 *  泛型上限:   ? extends Car:   ? 能接收的必须是Car或者其子类 。
 *  泛型下限：  ?  super Car ： ?  能接收的必须是Car或者其父类。

    Collections工具类源码：
            public class Collections {...}

    addAll源码：
            public static <T> boolean addAll(Collection<? super T> c, T... elements) {
        boolean result = false;
        for (T element : elements)
            result |= c.add(element);
        return result;
    }
    */
        List<String> names = new ArrayList<>();
        names.add("abc");
        names.add("abc");     //假设要添加一百个数据就太繁琐了，所以用Collections工具类的方法
        Collections.addAll(names, "张三", "王五", "李四", "张麻子");
        Collections.addAll(names,"曾季洪","牛逼");
        System.out.println(names);

        System.out.println("---------shuffle打乱-------------");
        // 2、public static void shuffle(List<?> list)：只是打乱List集合中的元素顺序。
        // 因为set系列集合是无序的，里面是由哈希值计算出来的位置
        Collections.shuffle(names);
        System.out.println(names);
        System.out.println("再打乱一次，成功：");
        Collections.shuffle(names);
        System.out.println(names);


        System.out.println("-----------sort升序------------");

        // 3、 public static <T> void sort(List<T> list)：只是对List集合中的元素进行升序排序。
        //注意：本方法可以直接对自定义类型的List集合排序，如果list集合中放了自定义类型对象，那么自定义类型必须实现了Comparable接口和指定比较规则才可以。
        List<Integer> list = new ArrayList<>();
        list.add(3);
        list.add(5);
        list.add(2);
        list.add(1);
        System.out.println(list);
        Collections.sort(list);
        System.out.println(list);

        System.out.println("------------指定排序-------------");

        List<Student> students = new ArrayList<>();
        students.add(new Student("蜘蛛精",23, 169.7));
        students.add(new Student("紫霞",22, 169.8));
        students.add(new Student("紫霞",22, 169.8));
        students.add(new Student("至尊宝",26, 165.5));
        System.out.println(students);
        //如果不重写student类里面的compareTo方法来规定学生对象的排序规则，直接调用sort那么会报错
        // Collections.sort(students);

        // 4、public static <T> void sort(List<T> list， Comparator<? super T> c): 对List集合中元素，按照比较器对象指定的规则进行排序
        //如果不想要在类里面实现Comparable接口来重写compareTo比较方法。可以选择比较器的方法，就近原则
        Collections.sort(students, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                //按照身高升序排序
                return Double.compare(o1.getHeight(), o2.getHeight());
            }
        });
        System.out.println(students);
    }
}
